package com.stu.day08.equals;

import java.util.Objects;

/**
 * 如果重写 equals()，必须重写 hashCode()，
 * 否则在哈希结构（HashSet、HashMap）中可能会导致错误行为。
 * @author zy
 * @date 2025/1/28 19:50
 */
public class EqualsDemo {
    public static void main(String[] args) {
        Person p1 = new Person(1,"Tom");
        Person p2 = new Person(1,"Tonny");
        System.out.println(p1.equals(p2));
    }
}
class Person {
    int id;
    String name;
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }

    // 重写equals()比较id
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;  // 自反性
        // instanceof允许与子类进行比较,如果o是PersonA的对象,PersonA是Person的子类,也可以用父类的equals比较
        if (!(o instanceof Person person)) return false;  // 一致性 (instanceof自会判断非空性)
        return id == person.id;  // 使用instanceof后,会自动强转,相当于省略Person person = (Person) o;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

//    // 重写equals()比较id和name
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;  // 自反性
          // getClass()不允许与子类进行比较
//        if (o == null || getClass() != o.getClass()) return false;  // 非空性/一致性
//        Person person = (Person) o;
//        return id == person.id && Objects.equals(name, person.name);
//    }
//
//    @Override
//    public int hashCode() {
//        return Objects.hash(id, name);
//    }
}
